#################################
###	   这是一个生成图片的文件	  ###
###				就很好		  ###
###				加油      	  ###
#################################




import os
from uuid import uuid1
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random

"""
生成验证码的工具文件
"""


def rnd_char():
    """
    随机一个字母或者数字
    :return:
    """
    # 随机一个字母或者数字
    i = random.randint(1, 3)
    if i == 1:
        # 随机 大写字母的十进制ASCII码
        an = random.randint(97, 122)
    elif i == 2:
        # 随机 小写字母的十进制ASCII码
        an = random.randint(65, 90)
    else:
        # 随机 数字的十进制ASCII码
        an = random.randint(48, 57)
    # 根据Ascii码转成字符，return回去
    return chr(an)


# 干扰
def rnd_dis():
    '''
    随机一个干扰字
    :return:
    '''
    d = ['^', '*', '~', '.', '%','#']

    i = random.randint(0, len(d) - 1)
    return d[i]


# 两个随机颜色都规定不同的区域，防止干扰字符和验证码字符颜色一样
# 随机颜色1:
def rnd_color():
    """
    随机颜色，干扰点
    :return:
    """
    return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))


# 随机颜色2:
def rnd_color2():
    """
      随机颜色，文字
      :return:
    """
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))


def rnd_color3():
    """
    随机颜色，干扰字符
    :return:
    """
    return (random.randint(16, 180), random.randint(16, 180), random.randint(16, 180))


def create_code():
    # 240 x 60: 图片的快高
    width = 50 * 3
    height = 50
    # 参3 图片的背景色
    image = Image.new('RGB', (width, height), (152, 192, 92))
    # 创建Font对象:
    # font = ImageFont.truetype('./font/BaseCamp.otf', 50)
    # font = ImageFont.truetype('./font/CorporateS-RegularItalic.otf', 50)
    # 必须用绝对路径
    font = ImageFont.truetype(os.path.dirname(os.path.abspath(__file__)) + '/font/CorporateS-RegularItalic.otf', 36)

    # 创建Draw对象:
    draw = ImageDraw.Draw(image)

    # 填充每个像素 干扰点:
    for x in range(0, width, 5):
        for y in range(0, height, 5):
            # 绘制一个点  (x, y)是点的坐标  fill是点的颜色
            draw.point((x, y), fill=rnd_color())

    # 填充字符
    _str = ""
    # 填入4个随机的数字或字母作为验证码
    for t in range(4):
        # 随机获取的一个字符
        c = rnd_char()
        # 格式化 拼接每次的字符
        _str = "{}{}".format(_str, c)

        # 随机距离图片上边高度，距离在-5到height/2-10之间
        top = random.randint(-2, height / 2 - 5)
        # print('top', top)
        # 距离左侧的距离，从20开始 向右每次添加四分之一宽度
        left = width / 4 * t + 20
        # 把当前的字母画上去
        draw.text((left, top), c, font=font, fill=rnd_color2())

    # 实际项目中，会将验证码 保存在数据库，并加上时间字段
    # print("保存验证码 {} 到数据库".format(_str))

    # 给图片加上字符干扰，密集度由 w, h控制
    for j in range(0, width, 30):
        dis = rnd_dis()

        # 距离左侧的距离，从20开始 向右每次添加j
        left = random.randint(3, 20) + j

        # 随机距离图片上边高度，距离在-5到height / 2 - 10之间
        top = random.randint(-2, height / 2 - 10)
        draw.text((left, top), dis, font=font, fill=rnd_color3())

    # 模糊:
    image.filter(ImageFilter.BLUR)

    # uuid1 生成唯一的字符串作为验证码图片名称
    # code_name = '{}.jpg'.format(uuid1())
    # save_dir = './{}'.format(code_name)
    # image.save(save_dir, 'jpeg')
    # print("已保存图片: {}".format(save_dir))
    # --------------下面return语句是新添加的----------------
    # 返回 验证码字符串 和image对象

    return _str, image

# if __name__ == '__main__':
# #     create_code()
